package com.tth.learn.addproperties.java1;

import org.junit.Test;

import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.Consumer;

/**
 * @Author tth
 * @Date 2023/1/3 14:28
 */
public class MethodReferenceTest {

    /**
     * 情况一： 对象 :: 实例方法
     *
     * Consumer中的void accept(T t)
     * PrintStream中的void println(String x)
     */
    @Test
    public void test1() {
        // 原Lambda表达式写法
        Consumer<String> con1 = str -> System.out.println(str);
        con1.accept("帘外雨潺潺，春意阑珊。");

        System.out.println("**************************************");

        // 方法引用写法
        PrintStream out = System.out;
        Consumer<String> con2 = out :: println;
        con2.accept("罗衾不耐五更寒。");
    }

    /**
     * 情况二： 类 :: 静态方法
     *
     * Comparator中的int compare(T o1, T o2)
     * Integer中的int compareTo(Integer anotherInteger)
     */
    @Test
    public void test2() {
        // 原Lambda写法
        Comparator<Integer> com1 = (o1, o2) -> Integer.compare(o1, o2);
        System.out.println(com1.compare(12, 13));

        System.out.println("**************************************");

        // 方法引用写法
        Comparator<Integer> com2 = Integer::compareTo;
        System.out.println(com2.compare(12, 13));
    }

    /**
     * 情况三： 类 :: 静态方法
     *
     * Comparator中的int compare(T t1, T t2)
     * String中的int t1.compareTo(t2)
     */
    @Test
    public void test3() {
        // 原Lambda写法
        Comparator<String> com1 = (t1, t2) -> t1.compareTo(t2);
        System.out.println(com1.compare("abc", "abd"));

        System.out.println("**************************************");

        // 方法引用写法
        Comparator<String> com2 = String :: compareTo;
        System.out.println(com2.compare("abc", "abm"));
    }
}
